package viewModel;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import modelo.entidad.Usuario;
import modelo.entidad.Usuario_Filtro;
import modelo.hibernate.dao.DaoUsuario;

import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.NotifyChange;

public class GestionUsuarioViewModel {

	private static final String usuarioMessage = "Total %d usuarios";

	private Usuario_Filtro usuarioFilter = new Usuario_Filtro();

	private DaoUsuario daoUsu = new DaoUsuario();

	List<Usuario> todosUsuarios;

	private static final long serialVersionUID = 1L;
	private boolean displayEdit = true;

	public boolean isDisplayEdit() {
		return displayEdit;
	}

	public GestionUsuarioViewModel() {
		super();
		try {
			todosUsuarios = daoUsu.obtenerTodos();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public List<Usuario> getObtenerUsuarios() {
		return todosUsuarios;
	}

	public Usuario_Filtro getUsuarioFilter() {
		return usuarioFilter;
	}

	public String getFooter() {
		return String.format(usuarioMessage, todosUsuarios.size());
	}

	@Command
	@NotifyChange({ "obtenerUsuarios", "footer" })
	public void changeFilter() {
		todosUsuarios = getFilterUsuarios(usuarioFilter);
	}

	@NotifyChange({ "obtenerUsuarios", "displayEdit" })
	public void setDisplayEdit(boolean displayEdit) {
		this.displayEdit = displayEdit;
	}

	@Command
	public void changeEditableStatus(@BindingParam("usuario") Usuario usuario) {
		usuario.setEditingStatus(!usuario.getEditingStatus());
		refreshRowTemplate(usuario);
	}

	@Command
	public void confirm(@BindingParam("usuario") Usuario us) {
		changeEditableStatus(us);
		try {
			daoUsu.actualizarUsuario(us);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		refreshRowTemplate(us);
	}

	public void refreshRowTemplate(Usuario es) {
		/*
		 * This code is special and notifies ZK that the bean's value has
		 * changed as it is used in the template mechanism. This stops the
		 * entire Grid's data from being refreshed
		 */
		BindUtils.postNotifyChange(null, null, es, "editingStatus");
	}

	@Command
	@NotifyChange({ "obtenerUsuarios", "footer" })
	public void eliminarRegistro(@BindingParam("usuario") Usuario es) {
		try {
			todosUsuarios.remove(es);
			daoUsu.eliminarUsuario(es);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public List<Usuario> getFilterUsuarios(Usuario_Filtro usuarioFilter) {

		List<Usuario> someUsuarios = new ArrayList<Usuario>();
		String log = usuarioFilter.getLogin();
		String ap = usuarioFilter.getApellido();
		String nom = usuarioFilter.getNombre();
		String doc = usuarioFilter.getEmail();

		List<Usuario> usuariosAll = null;
		try {
			usuariosAll = daoUsu.obtenerTodos();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		for (Iterator<Usuario> i = usuariosAll.iterator(); i.hasNext();) {
			Usuario tmp = i.next();
			if (tmp.getLogin().toLowerCase().contains(log)
					&& tmp.getLogin().toLowerCase().contains(log)
					&& tmp.getNombre().toLowerCase().contains(nom)
					&& tmp.getApellido().toLowerCase().contains(ap)
					&& tmp.getCedula().toLowerCase().contains(doc)) {
				someUsuarios.add(tmp);
			}
		}
		return someUsuarios;
	}
	
	


}
